#include <header.h>

int main(){

    int file_fd = open("1.txt", O_RDWR);

    ftruncate(file_fd, 100);

    struct stat st;
    fstat(file_fd, &st);

    // mmap: 文件映射
    // 第一个参数:  因为需要把文件映射到用户态, 所以需要我们在用户态提供一片"虚拟地址空间"来做映射
    //              -> 需要一片虚拟地址的首地址
    //             方式一: 手动开辟空间 提供mmap函数, 告诉这个函数, 把数据映射的位置
    //             方式二: 填NULL -> 让mmap函数自己在用户态选择合适的空间(有足够大小), 自己选位置
    // 第二个参数: 要映射的空间的大小
    //               -> eg: 10 , 代表开辟10个字节的映射空间 , (默认) 把文件的前10的字节映射过来
    //               ->    最好写文件大小
    // 第三个参数: 用来标记映射的用户态区域, 可读和可写状态
    //              PROT_READ |PROT_WRITE
    // 第四个参数:  数据同步问题 
    //              MAP_SHARED: 映射空间修改了, 立即写回磁盘文件
    // 第五个参数: 要映射的文件的文件描述符
    // 第六个参数: 偏移量, 从文件的多少偏移位置(从头向后的偏移), 开始映射到用户态开辟的空间
    //             偏移量要是4096/ page_size 的倍数
    //                -> eg: offset -> 4096 : 从文件的第4096字节向后内容, 映射到用户态开辟的空间
    //
    // 返回值:  就是选择的映射的用户态空间的首地址
    //void * p = mmap(NULL, st.st_size - 4096 ,PROT_READ|PROT_WRITE , MAP_SHARED , file_fd, 4096);

    char * p =(char *) mmap(NULL, st.st_size,PROT_READ|PROT_WRITE , MAP_SHARED , file_fd, 0);
   // strcpy(p, "hellooooooooooooo");

    //printf("%s \n", (char *)p);

    /*
    for(int i=10; i<st.st_size; i++){
        //p[i] = 'a';
        printf("%c", p[i]);
    }
    */
    printf("%s \n", p+10);


    munmap(p, st.st_size );
    return 0;
}

